package accesslog

import (
	"strings"

	"baseService/internal/global"
)

// SkipPathsConfig 跳过路径配置 - 单独文件方便修改
type SkipPathsConfig struct {
	// 静态资源路径 - 完全跳过记录
	StaticPaths []string

	// 系统接口路径 - 完全跳过记录
	SystemPaths []string

	// 大数据接口路径 - 轻量记录（不记录响应体）
	LightLogPaths []string
}

// GetDefaultSkipPaths 获取默认跳过路径配置
func GetDefaultSkipPaths() *SkipPathsConfig {
	return &SkipPathsConfig{
		// 静态资源 - 无需记录
		StaticPaths: []string{
			"*.css",        // CSS样式文件
			"*.js",         // JavaScript文件
			"*.png",        // PNG图片
			"*.jpg",        // JPEG图片
			"*.jpeg",       // JPEG图片
			"*.gif",        // GIF图片
			"*.ico",        // 图标文件
			"*.svg",        // SVG矢量图
			"*.woff",       // Web字体文件
			"*.woff2",      // Web字体文件v2
			"*.ttf",        // TrueType字体
			"*.eot",        // Embedded OpenType字体
			"/favicon.ico", // 网站图标
			"/robots.txt",  // 爬虫协议文件
		},

		// 系统接口 - 监控检查类，无业务价值
		SystemPaths: []string{
			"/health",          // 健康检查
			"/health/detailed", // 详细健康检查
			"/metrics",         // Prometheus指标
			"/ping",            // 简单ping检查
			"/status",          // 状态检查
			"/version",         // 版本信息
			"/actuator/*",      // Spring Actuator风格的监控端点
		},

		// 大数据接口 - 记录请求但不记录响应体（避免日志过大）
		LightLogPaths: []string{
			"/api/v1/orders",         // 订单列表接口
			"/api/v1/orders/history", // 订单历史接口
			"/api/v1/logs",           // 日志查询接口
			"/api/v1/logs/search",    // 日志搜索接口
			"/api/v1/export/*",       // 数据导出接口
			"/api/v1/reports/*",      // 报表生成接口
			"/api/v1/analytics/*",    // 数据分析接口
			"/api/v1/statistics/*",   // 统计数据接口
		},
	}
}

// GetAllSkipPaths 获取所有完全跳过的路径（静态资源 + 系统接口）
func (config *SkipPathsConfig) GetAllSkipPaths() []string {
	allPaths := make([]string, 0, len(config.StaticPaths)+len(config.SystemPaths))
	allPaths = append(allPaths, config.StaticPaths...)
	allPaths = append(allPaths, config.SystemPaths...)
	return allPaths
}

// GetLightLogPaths 获取轻量记录路径
func (config *SkipPathsConfig) GetLightLogPaths() []string {
	return config.LightLogPaths
}

// IsSkipPath 检查是否应该完全跳过记录
func (config *SkipPathsConfig) IsSkipPath(path string) bool {
	allSkipPaths := config.GetAllSkipPaths()
	return matchAnyPath(path, allSkipPaths)
}

// IsLightLogPath 检查是否应该轻量记录（不记录响应体）
func (config *SkipPathsConfig) IsLightLogPath(path string) bool {
	return matchAnyPath(path, config.LightLogPaths)
}

// matchAnyPath 检查路径是否匹配任何模式
func matchAnyPath(path string, patterns []string) bool {
	for _, pattern := range patterns {
		if matchPattern(path, pattern) {
			return true
		}
	}
	return false
}

// matchPattern 路径模式匹配
func matchPattern(path, pattern string) bool {
	// 通配符匹配
	if strings.Contains(pattern, "*") {
		// 简单通配符支持
		if strings.HasSuffix(pattern, "*") {
			prefix := strings.TrimSuffix(pattern, "*")
			return strings.HasPrefix(path, prefix)
		}
		if strings.HasPrefix(pattern, "*") {
			suffix := strings.TrimPrefix(pattern, "*")
			return strings.HasSuffix(path, suffix)
		}
	}

	// 精确匹配
	return path == pattern
}

// CustomSkipPathsConfig 从配置文件读取跳过路径配置
func CustomSkipPathsConfig() *SkipPathsConfig {
	// 如果配置文件中有配置，使用配置文件的值
	if global.Config != nil && global.Config.AccessLog.SkipPaths.Static != nil {
		return &SkipPathsConfig{
			StaticPaths:   global.Config.AccessLog.SkipPaths.Static,
			SystemPaths:   global.Config.AccessLog.SkipPaths.System,
			LightLogPaths: global.Config.AccessLog.LightLogPaths,
		}
	}

	// 否则使用默认配置
	return GetDefaultSkipPaths()
}
